package com.chapter7.neibulei.demo5;


/**
 * 局部内部类：在方法中定义内部类，甚至在语句块中定义内部类；
 *
 * 这种情况通常是某个方法需要创建一个类来辅助完成该方法的功能，而这个类只用在该方法中。
 *
 * 局部内部类需要配合接口来一起使用。
 */
public class LocalInnerClass {

    Speaker getSpeaker(String str){

        /**
         * 局部内部类限定了该类只能在局部作用域内被访问，因此是无法直
         * 接返回该类型的对象的，需要向上转型为其实现的接口类型。此外，局
         * 部内部类不能使用public和private访问说明符进行声明。
         */
         class Myspeaker implements Speaker{
             //实例变量str，就是getSpeaker的形参str的值，在构造内部类对象时，通过new MySpeaker（str）传入进去
             private String str;

             public  Myspeaker(String str){
                 this.str=str;
             }

             @Override
             public void speak() {
                 System.out.println(str);
             }
         }

         //返回内部类 Myspeaker对象； 向上转型Speaker接口类型
        return new Myspeaker(str);
    }

    public static void main(String[] args) {
        LocalInnerClass lic = new LocalInnerClass();
        lic.getSpeaker("Local inner class").speak();
    }

}
